Sqoop的安装配置与使用 您所在的位置:网站首页 如何查看sqoop job相关的命令 Sqoop的安装配置与使用

Sqoop的安装配置与使用

2024-01-31 02:22| 来源: 网络整理| 查看: 265

文章目录标题 介绍与特点概述工作机制 安装与配置Sqoop常用的命令操作 将数据库中的数据导入到HDFS将HDFS上的数据导出到数据库中从MYSQL导出数据到hive(Sqoop: Import Data From MySQL to Hive)Debug: 从Hive导出数据到MySQL

介绍与特点

Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。

对于某些NoSQL数据库它也提供了连接器。Sqoop,类似于其他ETL工具,使用元数据模型来判断数据类型并在数据从数据源转移到Hadoop时确保类型安全的数据处理。Sqoop专为大数据批量传输设计,能够分割数据集并创建Hadoop任务来处理每个区块。

概述

sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。

导入数据:MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系统;

导出数据:从Hadoop的文件系统中导出数据到关系数据库mysql等。

工作机制

将导入或导出命令翻译成mapreduce程序来实现。

在翻译出的mapreduce中主要是对inputformat和outputformat进行定制。

安装与配置

1、下载上传并解压放到 /usr/local 文件夹下 最新版下载地址http://ftp.wayne.edu/apache/sqoop/1.4.6/

tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /usr/local/

2、修改配置目录中的文件sqoop-env.sh

到指定目录下:/usr/local/sqoop-1.4.7.bin__hadoop-2.6.0/conf

重命名配置文件

mv sqoop-env-template.sh sqoop-env.sh vi sqoop-env.sh export HADOOP_COMMON_HOME=/usr/local/hadoop-2.7.7 export HADOOP_MAPRED_HOME=/usr/local/hadoop-2.7.7 export HIVE_HOME=/usr/local/apache-hive-1.2.2-bin

3、将mysql的驱动包mysql-connector-java-5.1.46-bin.jar复制到Sqoop安装目录下的lib文件夹中

4、配置环境变量

vi ~/.bashrc #sqoop export SQOOP_HOME=/usr/local/sqoop-1.4.7.bin__hadoop-2.6.0 export PATH=$PATH:$SQOOP_HOME/bin source ~/.bashrc

查看是否配置成功及版本号

sqoop version

在这里插入图片描述

到这里,Sqoop的张哥安装过程就结束了!

Sqoop常用的命令操作 sqoop help Available commands: codegen Generate code to interact with database records create-hive-table Import a table definition into Hive eval Evaluate a SQL statement and display the results export Export an HDFS directory to a database table help List available commands import Import a table from a database to HDFS import-all-tables Import tables from a database to HDFS import-mainframe Import datasets from a mainframe server to HDFS job Work with saved jobs list-databases List available databases on a server list-tables List available tables in a database merge Merge results of incremental imports metastore Run a standalone Sqoop metastore version Display version information

5、测试sqoop到mysql的连通性

查看数据库

bin/sqoop list-databases --connect jdbc:mysql://localhost:3306 --username root --password 123456

显示的databases与mysql显示的databases一样

在这里插入图片描述

查看数据库mysql中存在的表

bin/sqoop list-tables --connect jdbc:mysql://localhost:3306/mysql --username root --password 123456

在这里插入图片描述

将数据库中的数据导入到HDFS

指定输出路径、指定数据分隔符

–fields-terminated-by ‘\t’

bin/sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --table student --target-dir /sqoop/mysql1 --fields-terminated-by '\t'

指定Map数量 -m

-m 2

bin/sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --table student --target-dir /sqoop/mysql2 --fields-terminated-by '\t' -m 2

增加where条件, 注意:条件必须用引号引起来

id大于3: --where ‘id>3’

bin/sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --table student --where 'id>3' --target-dir /sqoop/mysql3 --fields-terminated-by '\t'

增加query语句(使用 \ 将语句换行)

bin/sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 \ --query 'SELECT * FROM student where id > 2 AND $CONDITIONS' --split-by student.id --target-dir /sqoop/mysql4

注意:如果使用–query这个命令的时候,需要注意的是where后面的参数,AND C O N D I T I O N S 这 个 参 数 必 须 加 上 而 且 存 在 单 引 号 与 双 引 号 的 区 别 , 如 果 − − q u e r y 后 面 使 用 的 是 双 引 号 , 那 么 需 要 在 CONDITIONS这个参数必须加上 而且存在单引号与双引号的区别,如果--query后面使用的是双引号,那么需要在 CONDITIONS这个参数必须加上而且存在单引号与双引号的区别,如果−−query后面使用的是双引号,那么需要在CONDITIONS前加上\即$CONDITIONS 如果设置map数量为1个时即-m 1,不用加上–split-by ${tablename.column},否则需要加上

先启动Hadoop

1、启动mysql,在test数据库下创建一个名为student的表(id int, name string)。

如果没有test数据库先创建一个数据库

create database test; # 使用test数据库 use test # 创建student表 create table student(id int primary key, name varchar(20));

并写入内容

insert into student values(1, "sartin"),(2, "board"),(3, "zhangsan"),(4, "lishi");

在这里插入图片描述

查看表结构:

desc student;

在这里插入图片描述

查看表数据:

select * from student;

在这里插入图片描述

2、退出mysql在sqoop目录下执行命令

执行命令将数据导入HDFS

bin/sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --table student --columns 'id, name' --target-dir /sqoop/mysql

参数含义:

--connect 链接mysql的URL直到数据库名 --username 用户名 --password 密码 --table 表名 --columns '列名称' --target-dir 存取的HDFS目录,不需要提前创建

查看hadoop是否产生相应的文件夹:

由于有四行数据,做一存在四个part-m-0000X

在这里插入图片描述

查看数据结果,分别对应了我们插入的四行数据: 在这里插入图片描述 在这里插入图片描述

将HDFS上的数据导出到数据库中

1、启动mysql,在test数据库中创建一个新表hdfsinto,表结构和student一样

create table hdfsinto(id int primary key, name varchar(20));

在这里插入图片描述

2、退出mysql在sqoop目录下执行命令

执行命令将HDFS中原本的表student数据导入到表hdfsinto中

bin/sqoop export --connect "jdbc:mysql://localhost:3306/test" --username root --password 123456 --table hdfsinto --export-dir /sqoop/mysql/*

参数含义:

--table 数据导入所在表的表名 --export-dir 数据所在位置

3、回到mysql查看表hdfsinto数据 在这里插入图片描述

从MYSQL导出数据到hive(Sqoop: Import Data From MySQL to Hive)

参考:https://dzone.com/articles/sqoop-import-data-from-mysql-to-hive

目的:通过Sqoop将MySQL中已有的表student及数据导入到Hive 若没有表,可自行创建一个新表并写入数据,可参考上面的操作

1、查看mysql中的表student 在这里插入图片描述 2、退出mysql在sqoop目录下执行命令

bin/sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --columns id,name --table student --target-dir /sqoop/studentToHive --fields-terminated-by "\t" --hive-import --create-hive-table --hive-table default.student2 -m 1 Debug:

然后报以下错误:

20/06/10 21:20:57 ERROR hive.HiveConfig: Could not load org.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR is set correctly. 20/06/10 21:20:57 ERROR tool.ImportTool: Import failed: java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf at org.apache.sqoop.hive.HiveConfig.getHiveConf(HiveConfig.java:50) at org.apache.sqoop.hive.HiveImport.getHiveArgs(HiveImport.java:392) at org.apache.sqoop.hive.HiveImport.executeExternalHiveScript(HiveImport.java:379) at org.apache.sqoop.hive.HiveImport.executeScript(HiveImport.java:337) at org.apache.sqoop.hive.HiveImport.importTable(HiveImport.java:241) at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:537) at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:628) at org.apache.sqoop.Sqoop.run(Sqoop.java:147) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183) at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234) at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243) at org.apache.sqoop.Sqoop.main(Sqoop.java:252) Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:419) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) at java.lang.ClassLoader.loadClass(ClassLoader.java:352) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) at org.apache.sqoop.hive.HiveConfig.getHiveConf(HiveConfig.java:44) ... 12 more

解决方法:

去到 {HIVE_HOME}/lib 目录下,而hive-common-1.2.2.jar这个jar还是自己查看以下自己的版本,每个人装的版本不一样

cp hive-common-1.2.2.jar /usr/local/sqoop-1.4.7.bin__hadoop-2.6.0/lib/

在这里插入图片描述 然后又报错

20/06/10 21:31:25 INFO hive.HiveImport: Loading uploaded data into Hive Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hive/shims/ShimLoader at org.apache.hadoop.hive.conf.HiveConf$ConfVars.(HiveConf.java:371) at org.apache.hadoop.hive.conf.HiveConf.(HiveConf.java:108) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) at org.apache.sqoop.hive.HiveConfig.getHiveConf(HiveConfig.java:44) at org.apache.sqoop.hive.HiveImport.getHiveArgs(HiveImport.java:392) at org.apache.sqoop.hive.HiveImport.executeExternalHiveScript(HiveImport.java:379) at org.apache.sqoop.hive.HiveImport.executeScript(HiveImport.java:337) at org.apache.sqoop.hive.HiveImport.importTable(HiveImport.java:241) at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:537) at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:628) at org.apache.sqoop.Sqoop.run(Sqoop.java:147) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183) at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234) at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243) at org.apache.sqoop.Sqoop.main(Sqoop.java:252) Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.shims.ShimLoader at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:419) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) at java.lang.ClassLoader.loadClass(ClassLoader.java:352) ... 17 more

解决方法: 去到 {HIVE_HOME}/lib 目录下,拷贝这个jar包

cp hive-exec-1.2.2.jar /usr/local/sqoop-1.4.7.bin__hadoop-2.6.0/lib

然后再重新尝试执行sqoop的命令就成功了 在这里插入图片描述

3、查看HDFS 此时该文件 /sqoop/studentToHive 是不存在(前面也可以不设置的),而是存进了hive的数据仓库里

hadoop fs -lsr /

在这里插入图片描述

4、查看Hive

show databases; use default; show tables; select * from student2;

在这里插入图片描述 MySQL中的数据成功导入到了HIve

从Hive导出数据到MySQL

目的:将hive中的表student2数据导入到mysql的表student2中

1、在MySQL中创建一个新表student2或者删除student表的中内容

create table student2(id int primary key, name varchar(20)); delete * from student;

2、确定你的Hive里存在这个表

3、到sqoop目录下执行命令

bin/sqoop export --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --table student2 --export-dir /user/hive/warehouse/student2/ --fields-terminated-by "\t"

在这里插入图片描述

4、登录到mysql查看表student2是否导入数据 在这里插入图片描述

成功!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有